#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h> // file option
#include <dirent.h>
// #include <iostream>
// #include <sstream>
// #include <vector>
// #include <list>
// #include <map>
// #include <thread>
// #include <string>
// #include <iomanip>
// #include <fstream>
// #include <vector>
// #include <set>
// #include <algorithm>
// #include <unordered_map>
// #include <mutex>
// #include <atomic>
// #include <bits/wordsize.h>
// #include <bits/timesize.h>
using namespace std;

//备注：字符串除了我们看到的内容1234567890abcdefg外，末尾还有个(0x00，也可以通过\0表示)
//strlen 得到的是1234567890abcdefg的长度17，但空间是18字节。
//这里列举常用str函数，men函数，snprintf, sscanf.
#define STR_DEF_1 "1234567890abcdefg"
#define STR_DEF_2 "abcdefg1234567890"
int main()
{
    char a[256], b[256];
    //strcpy拷贝函数，拷贝\0之前的字符串，但strncpy安全。
    strcpy(a, STR_DEF_1);//如果STR_DEF_1长度大于a空间，会导致崩溃
    //strlen判断\0来判断字符串长度。
    strncpy(a, STR_DEF_1, strlen(STR_DEF_1));//跟strcpy一样，根据STR_DEF_1长度来拷贝
    strncpy(a, STR_DEF_1, sizeof(a));//保证不会崩溃，但造成赋值次数增加。
    strncpy(b, STR_DEF_2, sizeof(b));//保证不会崩溃，但造成赋值次数增加。
    printf("a : %s\n", a);
    printf("b : %s\n", b);
    //strcmp比较，>0说明a中某个字节大于b；==0一样；<0说明字符串a某个字节<b对应的字节
    int tmpval = strcmp(a, b);
    printf("cmp : %d\n", tmpval);
    //strchr查找字符
    char *tmpp = strchr(a, 'd');//'z'
    if(tmpp != NULL)
    {
        printf("strchr:%d\n", (int)(tmpp - a));
    }
    else
    {
        printf("strchr: not find\n");
    }
    //查找字符串
    tmpp = strstr(a, "abc");//"xyz"
    if(tmpp != NULL)
    {
        printf("strstr:%d\n", (int)(tmpp - a));
    }
    else
    {
        printf("strstr: not find\n");
    }
    // strcat(a, b);不安全
    strncat(a, b, sizeof(a));//连接两字符串。安全。
    printf("a : %s\n", a); 


    //对应还有mem函数。men对应函数没有数据限制，因此随意操作。操作还是要注意不要越界。
    memset(a, 0, sizeof(a));//将数组所有内容设置为0
    memcpy(a, b, sizeof(a));//拷贝指定长度
    tmpval = memcmp(a, b, sizeof(a));//比较
    
    //字符串操作还有很好用的snprintf,使用格式输出到字符串中。
    char c[256];
    snprintf(c, sizeof(c), "%s-%d", a, tmpval);
    printf("c : %s\n", c);

    //自定格式输入
    sscanf(c, "%s", a);
    printf("a : %s\n", a); 
}

// 输出：
// a : 1234567890abcdefg
// b : abcdefg1234567890
// cmp : -48
// strchr:13
// strstr:10
// a : 1234567890abcdefgabcdefg1234567890
// c : abcdefg1234567890-0
// a : abcdefg1234567890-0
